import axios, {
    AxiosError,
    AxiosInstance, AxiosResponse,
} from 'axios'
import { config } from '@/config/axios/config'
import {getAccessToken} from "@/utils/auth";
import {Session} from "@/utils/storage";
import {showDialog, showToast} from "vant";
import errorCode from "@/config/axios/errorCode";

const { base_url, request_timeout } = config


// 创建axios实例
const service: AxiosInstance = axios.create({
  baseURL: base_url, // api 的 base_url
  timeout: request_timeout, // 请求超时时间
  withCredentials: false // 禁用 Cookie 等信息
})

// request拦截器
// 添加请求拦截器
service.interceptors.request.use(
    (config: any) => {
        // 在发送请求之前做些什么 token
        config.headers['tenant-id'] = 1;
        if (getAccessToken()) {
            config.headers['Authorization'] = 'Bearer ' + getAccessToken();
        }
        return config;
    },
    (error) => {
        // 对请求错误做些什么
        return Promise.reject(error);
    }
);

// response 拦截器
// response 拦截器
service.interceptors.response.use(
    async (response: AxiosResponse<any>) => {
        let { data } = response
        const config = response.config
        if (!data) {
            // 返回“[HTTP]请求没有返回值”;
            throw new Error()
        }
        // 未设置状态码则默认成功状态
        // 二进制数据则直接返回，例如说 Excel 导出
        if (
            response.request.responseType === 'blob' ||
            response.request.responseType === 'arraybuffer'
        ) {
            // 注意：如果导出的响应为 json，说明可能失败了，不直接返回进行下载
            if (response.data.type !== 'application/json') {
                return response.data
            }
            data = await new Response(response.data).json()
        }
        const code = data.code
        // 获取错误信息
        const msg = data.msg || errorCode[code] || errorCode['default']
        if (code === 401) {
            showToast(msg)
        } else if (code === 500) {
            showToast(msg)
            return Promise.reject(new Error(msg))
        } else if (code === 901) {
            showToast(msg)
            return Promise.reject(new Error(msg))
        } else if (code !== 200) {
            if (msg === '无效的刷新令牌') {
                // hard coding：忽略这个提示，直接登出
                console.log(msg)
            } else {
                showToast(msg)
            }
            return Promise.reject('error')
        } else {
            return data
        }
    },
    (error: AxiosError) => {
        console.log(error)
        // 对响应错误做点什么
        if (error.message.indexOf('timeout') != -1) {
            showToast('网络超时')
        } else if (error.message == 'Network Error') {
            showToast('网络连接错误')
        } else {
            if (error.message.indexOf('401') != -1) {
                showToast('当前登录信息已失效，请返回重新进入')
            } else if (error.response.data) showToast(error.response.statusText);
            else showToast('接口路径找不到')
        }
        return Promise.reject(error);
    }
)

export { service }
